【Java基础】内部类与初始化

您所在的位置:网站首页 java 静态对象什么时候初始化 【Java基础】内部类与初始化

【Java基础】内部类与初始化

2023-02-13 09:32| 来源: 网络整理| 查看: 265

内部类

在Java语言中,可以把一个类定义到另外一个类的内部,在类里面的这个类就叫做内部类,外面的类叫做外部类。在这种情况下,这个内部类可以被看成外部类的一个成员(与类的属性和方法类似)。还有一种类被称为顶层(Top-level)类,指的是类定义代码不嵌套在其他类定义中的类。

内部类主要有以下四种:静态内部类,成员内部类,局部内部类,匿名内部类。其定义方法如下:

class outerClass{        static class innerClass{}//静态内部类    }

 静态内部类是指被声明为static的内部类。它可以不依赖于外部类实例而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类·的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型)

class outerClass{       class innerClass{}//成员内部类(普通内部类)    }

一个静态内部类,如果去掉static关键字,就成为成员内部类。成员内部类为非静态内部类,它可自由引用外部类的属性和方法,无论这些属性和方法是静态的和非静态的。但是它与一个实例绑在了一起,不可以定义静态的属性和方法。只有在外部的类被实例化后,这个内部类才能被实例化。注意:非静态内部类中不能有静态成员。

 class outerClass{       public void memberFunction(){           class innerClass{}//局部内部类       }    }

局部内部类指的是定义在一个代码块内的类,其作用范围为其所在的代码块,是内部类中使用较少的一种类型。局部内部类像局部变量一样,不能被public,protected,private,static修饰,只能访问方法中定义为final类型的局部变量。

 public class MyFrame extends Frame{        //外部类        public MyFrame(){            addWindowListener(new WindowAdapter()            {//匿名内部类               public void windowClosing(WindowEvent e){                   dispose();                   System.exit(0);                }            });        }    }

 匿名内部类是一种没有类名的内部类,不使用关键字class,extends和implements,没有构造方法,它必须继承其他类或实现其他接口。匿名内部类的一般好处是使代码更加简洁紧凑,但易读性下降。一般应用于GUI(图形用户界面)编程中实现事件处理等。

Java程序初始化

在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。

观察以下代码:

public class HelloB extends HelloA{     public HelloB(){         System.out.println("HelloB");     }     {         System.out.println("I'm class B");     }     static{         System.out.println("static B");     }       public static void main(String[] args) {         new HelloB();     } } class HelloA{     public HelloA(){         System.out.println("HelloA");     }     {         System.out.println("I'm class A");     }     static{         System.out.println("static A");     } }

Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减):

静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象只初始化一次,而非静态对象(变量)可能会初始化多次;父类优先于子类进行初始化;按照成员变量定义顺序进行初始化,即使变量定义散布于方法定义中,它们依然在任何方法(包括构造方法)被调用之前请初始化。、

Java程序初始化工作可以在许多不同的代码块中完成(例如静态代码块,构造含数)他们执行的顺序如下:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块-,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数

 综上:上述程序运行结果为

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3